/*
 * QmcParameters.h
 *
 *  Created on:
 *      Author: snirgazit
 */

#ifndef QMCPARAMETERS_H_
#define QMCPARAMETERS_H_
#include "def.h"
#include <map>
using namespace std;
template<typename T>
class Param {
	bool init_;
	T val_;
public:
	Param() {
		init_ = false;
	}
	;
	void setVal(T val) {
		val_ = val;
		init_ = true;
	}
	T getVal() const {
		try {
			if (!init_)
				throw string("Uninitialized Params");
			return val_;
		} catch (string &e) {
			std::cout << e;
			exit(-1);
		}
	}
};

typedef map<string, bool> ToMeasure;

struct QmcParameters {
	Param<double> deltaDump;
	Param<int> L;
	Param<int> T;
	Param<IndexType> Llist;
	Param<double> g;
	Param<double> openCloseRatio;
	Param<double> U;
	Param<double> mu;
	Param<int> numOfBins;
	Param<int> binSize;
	Param<int> numOfBinsBS;
	Param<int> binSizeBS;
	Param<int> maximalBonds;
	Param<int> seed;
	Param<int> numOfThermal;
	Param<int> rate;
	Param<string> outPath;
	Param<int> rateFactor;
	Param<string> simType;
	Param<double> endTime;
	Param<int> numOfKPointsAmplitude;
	Param<bool> initFromFile;
	Param<ToMeasure> toMeasure;
	Param<double> maxNorm;
	Param<double> betaGibbs;
	Param<int> maxLoop;
	Param<bool> simulateAnnealing;
	Param<int> numOfGSA;
	Param<double> gHighT;
	Param<double> muHighT;
	Param<string> runNum;
	Param<double> asym;
	Param<int> SALoops;
	Param<int> SAAv;
};

#endif /* QMCPARAMETERS_H_ */
